package com.hopu.haogoumall.db.service.imple;

import com.github.pagehelper.PageHelper;
import com.hopu.haogoumall.db.dto.CategoryGoodsDto;
import com.hopu.haogoumall.db.dto.GrouponRulesDto;
import com.hopu.haogoumall.db.mapper.*;
import com.hopu.haogoumall.db.module.*;
import com.hopu.haogoumall.db.service.VxHomeService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Package: com.hopu.haogoumall.db.service.imple
 * @ClassName: VxHomeServiceImple
 * @Author: xiaoBao
 * @CreateTime: 2020-12-11 15:46
 * @Description:【商城首页相关功能业务层接口实现类】
 */
/** 定义业务层*/
@Service
public class VxHomeServiceImple implements VxHomeService {
    /** 通过工厂获取Logger日志对象用于输出日志信息*/
    Logger logger = LoggerFactory.getLogger(getClass());
    /** 引入Service业务层*/
    @Resource
    private HaogoumallCategoryMapper categoryMapper;
    @Resource
    private HaogoumallGoodsMapper goodsMapper;
    @Resource
    private HaogoumallAdMapper adMapper;
    @Resource
    private HaogoumallCouponMapper couponMapper;
    @Resource
    private HaogoumallGroupon_RulesMapper groupon_RulesMapper;
    @Resource
    private HaogoumallBrandMapper brandMapper;
    @Resource
    private HaogoumallTopicMapper topicMapper;


    /**
     * findGoodsCount 查询商品总数量
     * @return 将持久层返回的商品数据返回给表现层
     */
    @Override
    public int findGoodsCount() {
        return goodsMapper.findGoodsCount();
    }

    /**
     * findBannerInfo 查询所有广告信息
     * @return 将所有广告信息数据返回给表现层
     */
    @Override
    public List<HaogoumallAd> findBannerInfo() {
        return adMapper.findBannerInfo();
    }

    /**
     * findCategoryInfo 查询所有商品分类
     * @param pid 商品类别Id—category_pid
     * @return 将所有查新到的分类信息数据返回给表现层
     */
    @Override
    public List<HaogoumallCategory> findCategoryInfo(Integer pid) {
        return categoryMapper.findCategoryInfo(pid);
    }

    /**
     * findCouponInfo 查询所有优惠券信息 （分页）
     * @param couponPage 优惠券显示的当前页(从1开始)
     * @param couponLimit 每页显示的优惠券数量(首页每次显示2张优惠券)
     * @return 将查询到的优惠券数据返回给表现层
     */
    @Override
    public List<HaogoumallCoupon> findCouponInfo(Integer couponPage, Integer couponLimit) {
        /** 使用分页技术将优惠券列表进行分页*/
        // startPage方法：参数1：配置 “分页的初始页”；参数2：“当前页要显示的信息行数”
        PageHelper.startPage(couponPage,couponLimit);

        return couponMapper.findCouponInfo();
    }

    /**
     * findGrouponInfo 查询所有团购信息 （分页）
     * @param grouponPage 团购信息的当前页；
     * @param grouponLimit 每页显示的团购信息数量；
     * @return 将分页后的团购信息返回给表现层
     */
    @Override
    public List<GrouponRulesDto> findGrouponInfo(Integer grouponPage, Integer grouponLimit) {
        /** 使用分页技术将团购信息列表进行分页*/
        // startPage方法：参数1：配置 “分页的初始页”；参数2：“当前页要显示的信息行数”
        PageHelper.startPage(grouponPage,grouponLimit);

        return groupon_RulesMapper.findGrouponInfo();
    }

    /**
     * findBrandInfo 查询所有品牌直供商相关信息 （分页）
     * @param brandPage 品牌直供商信息的当前页；
     * @param brandLimit 每页显示的品牌直供商数量；
     * @return 将分页后的品牌直供商信息返回给表现层
     */
    @Override
    public List<HaogoumallBrand> findBrandInfo(Integer brandPage, Integer brandLimit) {
        /** 使用分页技术将品牌直供商信息列表进行分页*/
        // startPage方法：参数1：配置 “分页的初始页”；参数2：“当前页要显示的信息行数”
        PageHelper.startPage(brandPage,brandLimit);

        return brandMapper.findBrandInfo();
    }

    /**
     * findNewGoodsInfo 查询所有新品发售商品信息 （分页）
     * @param newGoodPage 新品发售商品的当前页；
     * @param newGoodLimit 每页显示的数量；
     * @return 将查询到的新品发售商品数据进行分页后返回给表现层
     */
    @Override
    public List<HaogoumallGoods> findNewGoodsInfo(Integer newGoodPage, Integer newGoodLimit) {
        /** 使用分页技术将新品发售商品信息列表进行分页*/
        // startPage方法：参数1：配置 “分页的初始页”；参数2：“当前页要显示的信息行数”
        PageHelper.startPage(newGoodPage,newGoodLimit);

        return goodsMapper.findNewGoodsInfo();
    }

    /**
     * findHotGoodsInfo 查询所有人气商品
     * @param hotGoodPage 人气商品的当前页；
     * @param hotGoodLimit 每页显示的数量；
     * @return 将查询到的人气商品信息列表进行分页后返回给表现层
     */
    @Override
    public List<HaogoumallGoods> findHotGoodsInfo(Integer hotGoodPage, Integer hotGoodLimit) {
        /** 使用分页技术将人气商品信息列表进行分页*/
        // startPage方法：参数1：配置 “分页的初始页”；参数2：“当前页要显示的信息行数”
        PageHelper.startPage(hotGoodPage,hotGoodLimit);

        return goodsMapper.findHotGoodsInfo();
    }

    /**
     * findTopicInfo 查询所有专题精选商品
     * @param topicPage 专题精选商品的当前页
     * @param topicLimit 每页显示的数量
     * @return 将查询到专题精选商品列表进行分页后返回给表现层
     */
    @Override
    public List<HaogoumallTopic> findTopicInfo(Integer topicPage, Integer topicLimit) {
        /** 使用分页技术将专题精选商品信息列表进行分页*/
        // startPage方法：参数1：配置 “分页的初始页”；参数2：“当前页要显示的信息行数”
        PageHelper.startPage(topicPage,topicLimit);

        return topicMapper.findTopicInfo();
    }

    /**
     * findFloorGoodInfo 查询每个分类的部分商品显示在首页
     * @param floorGoodPage 每个分类的当前页
     * @param floorGoodLimit 每页显示的数量
     * @param pid 父级分类名称的Pid
     * @return 将查询到的分类商品进行分页后并返回给表现层
     */
    @Override
    public List<CategoryGoodsDto> findFloorGoodInfo(Integer floorGoodPage, Integer floorGoodLimit, Integer pid) {
        // 实例化一个新的List集合    用于存放存储了分类名称、Id和分类商品信息（List集合）的Map集合
        List floorGoodList = new ArrayList<>();

        /** 调用持久层操作：查询所有分类名称*/
        List<HaogoumallCategory> categoryInfo = categoryMapper.findCategoryInfo(pid);

        // 循环获得所有取得分类名称用于查询相关分类商品
        for (int i=0;i<categoryInfo.size();i++){
            // 实例化一个Map集合存放分类名称和Id以及分类商品信息集合
            Map map = new HashMap();

            // 根据下标循环获取所有父级分类对象
            HaogoumallCategory haogoumallCategory = categoryInfo.get(i);

            // 获取对象中的分类名称和Id
            String categoryName = haogoumallCategory.getCategoryName();
            Integer categoryId = haogoumallCategory.getCategoryId();

            // 循环将分类名称和Id设置进Map集合中  根据前端需要的参数添加对应的Key名称
            map.put("name",categoryName);
            map.put("categoryId",categoryId);

            /** 使用分页技术将分类商品信息列表进行分页*/
            // startPage方法：参数1：配置 “分页的初始页”；参数2：“当前页要显示的信息行数”
            PageHelper.startPage(floorGoodPage,floorGoodLimit);

            /** 调用持久层操作：根据分类名称查询对应的商品信息*/
            List<CategoryGoodsDto> goodsList = goodsMapper.findFloorGoodInfo(categoryName);

            // 将商品信息集合添加到Map集合中
            map.put("goodsList",goodsList);

            // 最后将Map集合添加到List集合中 以循环的下标作为每个对象的下标
            floorGoodList.add(i,map);
        }

        // 最后将集合返回给当前方法，在表现层调用；
        return floorGoodList;
    }
}
